/**
 * js中的函数
 */
// 通过function定义
function f1(a,b){
    return a+b;
}
// 通过匿名函数定义
var f2 = function(a,b){return a+b}

// 通过箭头函数
var f3 = (a,b)=>a+b;

/**
 * ts中  为参数定义类型
 * 1. 调用方法时，参数的类型、数量必须一致
 * 2. 如果定义参数时，没有为参数定义类型，则采用默认any类型
 */

function f4 (name:string,sex:string){
    console.log(name,sex);
}
f4("xiaoming","男");

/**
 * 可选参数，说明参数可以省略不写
 * 1.使用?表示参数可选
 * 2.可选参数必须位于必选参数的后面
 * 3.可选参数可以有多个，但容易引起歧义
 */
function f5 (a:string,b?:number){
    console.log("我是可选参数,参数b可选可不选");
}
f5("可选参数可以不传递");

/**
 * 默认参数，可以为参数指定未传值时的默认值
 * 注：当未传递参数，或传递undefined时使用默认值
 */
function f6 (a:string,b:number=10086){
    console.log("我是默认参数，不传或者传入undefind时默认参数的值为：",b);
}
f6("传递参数",10011);
f6("不传递参数");
f6("传undefined",undefined);

/**
 * 剩余参数
 * 1.参数个数任意，可以有多个，也可以没有
 * 2.使用...定义剩余数组，类型为数组，会将传入的所有参数封装到该数组中
 */
function f7 (a:string,...b:number[]){
    console.log("参数a值为：",a);
    console.log("参数b值为：",b);
}
f7("xiaoming",10,25,40,65,70,88);

/**
 * 为函数定义返回值的类型
 * 当函数没有返回值时，指定为void
 */
function f8():string{
    return "返回字符串";
}
// 声明一个没有返回值的函数
function f9():void{}

/**
 * 函数类型
 */
// 定义一个变量，类型为函数，参数为string、number，返回值为boolean
let f10: (a:string,b:number) => boolean;
// 为变量赋值一个同类型的函数，值一定要满足函数类型变量f10的限制
f10 = function (a:string,b:number):boolean{
    return true;
}

// 将以上代码写在一起
let f11: (a:string,b:number) => boolean=function (a:string,b:number):boolean{
    return true;
}